package jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import java.util.*;

/**
 * jedis管道的使用
 * 作用：一次性发送多个请求
 * 使用管道需要注意以下几点：
 * 1. 每条命令都不能依赖于之前命令的执行结果
 * 2. 如果中间某条命令执行失败，不影响之后命令的执行
 * 3. 管道中的每条命令执行期间，可以有其他线程的命令插队执行，这点与redis的事物不一样
 * 4. 由于redis需要处理完所有命令之后再返回客户端结果，因此在这之前，需要在内存中缓存已处理完命令的结果，所以并不是打包的命令越多越好
 */
public class PipelineDemo {

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.10.100", 6379);
        jedis.auth("Bocon123456*");

        Pipeline pipeline = jedis.pipelined();


        List<Response<String>> responseList = new ArrayList<>();

        for(int i=1; i<10; i++){
            Response<String> response = pipeline.set("p"+i, "v"+i);
            responseList.add(response);
        }

        pipeline.setnx("mm", "1");

        /**
         * 可以单个返回响应结果，也可以在提交执行时一起返回响应结果
         */
        System.out.println(pipeline.syncAndReturnAll());

        for(Response<String> response : responseList){
            System.out.println(response.get());
        }

        for(int i=1; i<10; i++){
            System.out.println(jedis.get("p"+i));
        }

        System.out.println(jedis.get("mm"));
    }
}
